/**
 * 
 */
package it.unisalento.appsalento.asynctask;

import it.unisalento.appsalento.constants.Constants;
import it.unisalento.appsalento.activity.App;
import it.unisalento.appsalento.asynctask.framework.MIMETypes;
import it.unisalento.appsalento.bo.mock.MockBo;
import it.unisalento.appsalento.model.Appello;
import it.unisalento.appsalento.model.GetAppelliResponse;
import it.unisalento.appsalento.model.Request;

import java.io.InputStream;
import java.util.ArrayList;

import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.view.MenuItem;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

/**
 * <p>
 * <b>Description</b>: Classe che estende Async Task. Tale classe si occupa di sincronizzare da WS 
 * gli appelli ai quali può iscriversi lo studente. Gli appelli vengono memorizzati all'interno dell'oggetto
 * App.appelli
 * </p>
 * @author Alberto Gianfranco Meleleo
 * 
 */
public class CalendarAsyncTask extends SyncAsyncTask {

	public CalendarAsyncTask(Context context, MenuItem refreshMenuItem) {
		this.context = context;
		this.refreshMenuItem = refreshMenuItem;
	}
	
	@Override
	protected void onPostExecute(Void result) {
		super.onPostExecute(result);
		if (refreshMenuItem != null) {
			if (App.calendarioFragment != null
					&& App.calendarioFragment.isVisible()) {
				App.calendarioFragment.refreshCalendar();
			}
			refreshMenuItem.collapseActionView();
			// remove the progress bar view
			refreshMenuItem.setActionView(null);
		}
		
		Intent intent = new Intent(Constants.UPDATE_APPELLI_EVENT);
		LocalBroadcastManager.getInstance(
				App.currentActivity().getApplicationContext()).sendBroadcast(
				intent);
	}

	/**
	 * Metodo che si occupa di effettuare la chiamata ai WS per ottenere la lista di appelli.
	 * @param mapper ObjectMapper necessario per la conversione del json restituito in oggetto java.
	 * @return 
	 * <li>true : se la chiamata ai ws è andata a buon fine</li>
	 * <li>false : se la chiamata ai ws ha restituito un errore o se il parametro status del json di risposta è
	 * impostato a KO</li>
	 */
	public boolean setData(ObjectMapper mapper)  {
		boolean retVal = false;
		try {
			GetAppelliResponse appelliResponse = null;
			if(!Constants.MOCK_ENABLED){
				Request request = new Request();
				request.setUtente(App.utente);
				
				final Client client = Client.create();
			    final WebResource resource  = client.resource(Constants.URL_REST + Constants.SERVICE_LISTA_APPELLI);
			    final ClientResponse response = resource.type(MIMETypes.APPLICATION_JSON.getName()).post(ClientResponse.class, gson.toJson(request));
			    if (response.getStatus() != 201 && response.getStatus() != 200) {
			      throw new RuntimeException("failed: http error code = " + response.getStatus());
			    }
			    final String responseEntity = response.getEntity(String.class).replaceAll("\\\\", "");
			    appelliResponse = mapper.readValue(responseEntity,GetAppelliResponse.class);
			}else{
				InputStream is = context.getAssets().open(MockBo.GET_APPELLI_RESPONSE);
				appelliResponse = mapper.readValue(is,GetAppelliResponse.class);
			}
			if(appelliResponse != null){
				App.appelli = new ArrayList<Appello>();
				if (appelliResponse.isOk()) {
					App.appelli = new ArrayList<Appello>();
					App.appelli.addAll(appelliResponse.getListaAppelli());
				}
			
				retVal = appelliResponse.isOk();
			}
		} catch (Throwable t) {
			App.appelli = new ArrayList<Appello>();
			t.printStackTrace();
		}
		return retVal;
	}
}
